home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / imlib / port / x11 / event.c next >
C/C++ Source or Header  |  1997-05-20  |  7KB  |  237 lines

  1. #include "system.h"
  2. #include "xinclude.h"
  3. #include "image.hpp"
  4. #include "palette.hpp"
  5. #include "mdlread.hpp"
  6. #include "video.hpp"
  7. #include "gifread.hpp"
  8. #include "macs.hpp"
  9. #include "mouse.hpp"
  10. #include "event.hpp"
  11. #include "sprite.hpp"
  12. #include "xinclude.h"
  13.  
  14.  
  15. extern Display *display;
  16. extern int screen_num;
  17. extern Screen *screen_ptr;
  18. extern Window mainwin;
  19.  
  20. void event_handler::flush_screen()
  21. {
  22.   update_dirty(screen);
  23. }
  24.  
  25. int event_handler::get_key_flags()
  26. {
  27.   Window w1,w2;
  28.   int j;
  29.   unsigned mask;
  30.   XQueryPointer(display,mainwin,&w1,&w2,&j,&j,&j,&j,&mask);
  31.   return ((mask&ShiftMask)!=0)<<3 | ((mask&ControlMask)!=0)<<2 |
  32.      ((mask&8)!=0)<<1;
  33. }
  34.  
  35.  
  36. int event_handler::event_waiting()
  37. {
  38.   if (ewaiting) return 1;
  39.   if (XPending(display))
  40.     ewaiting=1;
  41. /*  else if (last_keystat!=get_key_flags())
  42.     ewaiting=1;*/
  43.   return ewaiting;
  44. }
  45.  
  46. event_handler::event_handler(image *screen, palette *pal)
  47. {
  48.   CHECK(screen && pal);
  49.   mouse=new JCMouse(screen,pal);
  50.   mhere=mouse->exsist();
  51.   last_keystat=get_key_flags();
  52.   XSelectInput(display,mainwin,
  53.     KeyPressMask | VisibilityChangeMask | ButtonPressMask | ButtonReleaseMask |
  54.     ButtonMotionMask | PointerMotionMask | KeyReleaseMask |
  55.     ExposureMask | StructureNotifyMask);
  56.   mhere=1;
  57.   ewaiting=0;
  58. }
  59.  
  60. void event_handler::get_event(event &ev)
  61. {
  62.   int kf,kf_change=0;
  63.   event *ep;
  64.   while (!ewaiting)
  65.     event_waiting();
  66.  
  67.   ep=(event *)events.first();
  68.   if (ep)
  69.   { ev=*ep;
  70.     events.unlink((linked_node *)ep);
  71.     delete ep;
  72.     ewaiting=events.first()!=NULL;
  73.   }
  74.   else
  75.   {
  76.     // note : that the mouse status
  77.     // should be know even if
  78.     // other event has occured
  79.     ev.mouse_move.x=mouse->x();
  80.     ev.mouse_move.y=mouse->y();
  81.     ev.mouse_button=mouse->button();
  82.  
  83. /*    kf=get_key_flags();
  84.     if (kf!=last_keystat)
  85.     { last_keystat=kf;
  86.       kf_change=1;
  87.       ev.type=EV_KEY_SPECIAL;
  88.       ev.key_special.shift=kf&2;
  89.       ev.key_special.ctrl=kf&4;
  90.       ev.key_special.alt=kf&8;
  91.     } */
  92.  
  93.     XEvent xev;
  94.     image *n;
  95.     int np,ij,sp;
  96.     linked_node *pagep;
  97.     if (XPending(display))
  98.     {
  99.       XNextEvent(display,&xev);
  100.       ev.window=(jwindow *)xev.xany.window;
  101.       switch (xev.type)
  102.       { 
  103.         case ConfigureNotify :
  104.      {
  105.           if (xev.xany.window==mainwin && (screen->width()!=xev.xconfigure.width || 
  106.         screen->height()!=xev.xconfigure.height))
  107.           {
  108.         XFlush(display);
  109.         int new_width=xev.xconfigure.width&~3;  // must be word alligned
  110.         if (new_width!=xev.xconfigure.width)
  111.           XResizeWindow(display,mainwin,new_width,xev.xconfigure.height);
  112.  
  113.         screen->change_size(new_width,xev.xconfigure.height);
  114.         screen->clear_dirties();
  115.         screen->clear();
  116.  
  117.             xres=screen->width()-1;
  118.             yres=screen->height()-1;
  119.             ev.type=EV_RESIZE;
  120.           }
  121.           else 
  122.         ev.type=EV_SPURIOUS;
  123.         } break;
  124.           
  125.         case Expose :
  126.         { ev.type=EV_REDRAW;
  127.           ev.redraw.x1=xev.xexpose.x;
  128.           ev.redraw.y1=xev.xexpose.y;
  129.           ev.redraw.x2=ev.redraw.x1+xev.xexpose.width;
  130.           ev.redraw.y2=ev.redraw.y1+xev.xexpose.height;
  131.           ev.redraw.start=NULL;
  132.         } break;
  133.         case KeyPress :
  134.         case KeyRelease :
  135.         {
  136.           if (!kf_change)  // if the key flags changed, it's not a real key
  137.           {
  138.             char buf;
  139.             KeySym ks;
  140.             XLookupString(&xev.xkey,&buf,1,&ks,NULL); 
  141.             if (xev.type==KeyPress)
  142.               ev.type=EV_KEY; 
  143.             else ev.type=EV_KEYRELEASE;
  144.             switch (ks)
  145.             { case XK_Down :         ev.key=JK_DOWN; break;
  146.               case XK_Up :          ev.key=JK_UP;  break;
  147.               case XK_Left :         ev.key=JK_LEFT;  break;
  148.               case XK_Right :         ev.key=JK_RIGHT;  break;
  149.               case XK_Control_L :     ev.key=JK_CTRL_L;  break;
  150.               case XK_Control_R :     ev.key=JK_CTRL_R;  break;
  151.               case XK_Alt_L :         ev.key=JK_ALT_L;  break;
  152.               case XK_Alt_R :         ev.key=JK_ALT_R;  break;
  153.               case XK_Shift_L :     ev.key=JK_SHIFT_L;  break;
  154.               case XK_Shift_R :     ev.key=JK_SHIFT_R;  break;
  155.               case XK_Num_Lock :     ev.key=JK_NUM_LOCK;  break;
  156.               case XK_Home :         ev.key=JK_HOME;  break;
  157.               case XK_End :         ev.key=JK_END;  break;
  158.               case XK_BackSpace :    ev.key=JK_BACKSPACE;  break;
  159.               case XK_Tab :        ev.key=JK_TAB;  break;
  160.               case XK_Return :        ev.key=JK_ENTER;  break;
  161.               case XK_Caps_Lock :    ev.key=JK_CAPS;  break;
  162.               case XK_Escape :        ev.key=JK_ESC;  break;
  163.               case XK_F1 :              ev.key=JK_F1; break;
  164.               case XK_F2 :              ev.key=JK_F2; break;
  165.               case XK_F3 :              ev.key=JK_F3; break;
  166.               case XK_F4 :              ev.key=JK_F4; break;
  167.               case XK_F5 :              ev.key=JK_F5; break;
  168.               case XK_F6 :              ev.key=JK_F6; break;
  169.               case XK_F7 :              ev.key=JK_F7; break;
  170.               case XK_F8 :              ev.key=JK_F8; break;
  171.               case XK_F9 :              ev.key=JK_F9; break;
  172.               case XK_F10 :             ev.key=JK_F10; break;
  173.           case XK_Insert :          ev.key=JK_INSERT; break;
  174.           case XK_Page_Up :         ev.key=JK_PAGEUP; break;
  175.           case XK_Page_Down :       ev.key=JK_PAGEDOWN; break;
  176.               default :
  177.                if (buf)
  178.                {
  179.                  ev.key=(int)buf;
  180.                }
  181.                else ev.type=EV_SPURIOUS;
  182.             }
  183.           }
  184.         } break;
  185.         case MotionNotify : 
  186.         {
  187.           mouse->update(xev.xmotion.x,xev.xmotion.y,mouse->button());
  188.           ev.type=EV_MOUSE_MOVE;
  189.           ev.mouse_move.x=mouse->x();
  190.           ev.mouse_move.y=mouse->y();
  191.         } break;
  192.         case ButtonRelease :
  193.         { switch (xev.xbutton.button)
  194.           { case 1 : ev.mouse_button&=(0xff-1); break;
  195.             case 2 : ev.mouse_button&=(0xff-4); break;
  196.             case 3 : ev.mouse_button&=(0xff-2); break;
  197.           }
  198.         } // no break here please...
  199.         case ButtonPress :
  200.         { 
  201.           if (xev.type==ButtonPress)
  202.           { switch (xev.xbutton.button)
  203.             { case 1 : ev.mouse_button|=1; break;
  204.               case 2 : ev.mouse_button|=4; break;
  205.               case 3 : ev.mouse_button|=2; break;
  206.             }
  207.           }
  208.           mouse->update(mouse->x(),mouse->y(),ev.mouse_button);
  209.           ev.type=EV_MOUSE_BUTTON;
  210.           ev.mouse_move.x=mouse->x();
  211.           ev.mouse_move.y=mouse->y();
  212.         } break;
  213.       }
  214.     }
  215.     ewaiting=0;
  216.   }
  217. }
  218.  
  219.  
  220. void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
  221. {
  222.   event *ev;
  223.   ev=new event;
  224.   ev->type=EV_REDRAW;
  225.   ev->redraw.x1=X1; ev->redraw.x2=X2;
  226.   ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
  227.   events.add_end((linked_node *)ev);
  228. }
  229.  
  230. event_handler::~event_handler() { delete mouse; }
  231.  
  232.  
  233.  
  234.  
  235.  
  236.  
  237.